from typing import List
"""
    给你一个整数数组 nums ，
    其中可能包含重复元素，请你返回该数组所有可能的 子集（幂集）。
    解集 不能 包含重复的子集。
    返回的解集中，子集可以按 任意顺序 排列。

    示例 1：
        输入：nums = [1,2,2]
        输出：[[],[1],[1,2],[1,2,2],[2],[2,2]] 
"""

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        ans = [[]]
        tem = []
        used = []
        for i in range(len(nums)):
            used.append(0)

        def backtracking(begin):
            if begin == len(nums):
                return
            for i in range(begin,len(nums)):
                if i != 0 and used[i-1] == 0 and nums[i] == nums[i-1]:
                    continue
                tem.append(nums[i])
                used[i] = 1
                ans.append(tem.copy())
                backtracking(i+1)
                used[i] = 0
                tem.pop()
            return
        backtracking(0)
        return ans